package com.learning.thread.juc.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * ClassName: ConcurrentModificationExceptionTest
 * Description:  在迭代集合的时候不能对集合作修改
 * <p>
 * 分析：
 * modCount 为操作集合的次数，如集合增加三个元素，则为3，删除一个后为4。
 * expectedModCount 为一迭代前 modCount的值。
 * 迭代的时候，next()-->checkForComodification()-->modCount != expectedModCount 抛出 ConcurrentModificationException
 * Date: 2018/7/6 10:26 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class ConcurrentModificationExceptionTest {

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        // 换成 CopyOnWriteArrayList 就没有问题
//        CopyOnWriteArrayList list = new CopyOnWriteArrayList();
        Collections.synchronizedList(list);
//        Collections.synchronizedMap()

        list.add("张三");
        list.add("李四");
        list.add("王五");

        Iterator<String> iterator = list.iterator();
        //迭代集合
        while (iterator.hasNext()) {
            String next = iterator.next();
            if ("张三".equals(next)) {
                // 在集合遍历的时候，不能由其他的线程对其内部元素做修改
                list.remove(next);
            } else {
                System.out.println(next);
            }
        }
    }
}
